home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / os2 / ext2_200.zip / EXT2_SRC.ZIP / 32BITS / EXT2-OS2 / FSD32 / FS32_CLO.C < prev    next >
C/C++ Source or Header  |  1996-09-21  |  4KB  |  140 lines

  1. //
  2. // $Header: D:/32bits/ext2-os2/fsd32/RCS/fs32_close.c,v 1.1 1996/09/21 22:24:05 Willm Exp Willm $
  3. //
  4.  
  5. // 32 bits Linux ext2 file system driver for OS/2 WARP - Allows OS/2 to
  6. // access your Linux ext2fs partitions as normal drive letters.
  7. // Copyright (C) 1995, 1996 Matthieu WILLM
  8. //
  9. // This program is free software; you can redistribute it and/or modify
  10. // it under the terms of the GNU General Public License as published by
  11. // the Free Software Foundation; either version 2 of the License, or
  12. // (at your option) any later version.
  13. //
  14. // This program is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. // GNU General Public License for more details.
  18. //
  19. // You should have received a copy of the GNU General Public License
  20. // along with this program; if not, write to the Free Software
  21. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  22. #ifdef __IBMC__
  23. #pragma strings(readonly)
  24. #endif
  25.  
  26.  
  27. #define INCL_DOS
  28. #define INCL_DOSERRORS
  29. #define INCL_NOPMAPI
  30. #include <os2.h>
  31.  
  32. #include <string.h>
  33.  
  34. #include <os2/types.h>
  35. #include <os2/StackToFlat.h>
  36. #include <linux/fs.h>
  37. #include <os2/os2proto.h>
  38. #include <os2/fsd32.h>
  39. #include <os2/DevHlp32.h>
  40. #include <os2/log.h>
  41. #include <os2/errors.h>
  42. #include <os2/trace.h>
  43. #include <os2/files.h>
  44.  
  45. /*
  46.  * struct fs32_close_parms {
  47.  *     PTR16 psffsd;
  48.  *     PTR16 psffsi;
  49.  *     unsigned short IOflag;
  50.  *     unsigned short type;
  51.  * };
  52.  */
  53. int FS32ENTRY fs32_close(struct fs32_close_parms *parms) {
  54.     struct sffsi32 *psffsi;
  55.     union  sffsd32 *psffsd;
  56.     int             rc;
  57.  
  58.     parms = __StackToFlat(parms);
  59.  
  60.     if ((rc = DevHlp32_VirtToLin(parms->psffsi, __StackToFlat(&psffsi))) == NO_ERROR) {
  61.         if ((rc = DevHlp32_VirtToLin(parms->psffsd, __StackToFlat(&psffsd))) == NO_ERROR) {
  62.             if (trace_FS_CLOSE) {
  63.                 kernel_printf("FS_CLOSE(ino = %lu, type = %d)",  psffsd->f->f_inode->i_ino, parms->type);
  64.             }
  65.  
  66.  
  67.     //
  68.     // Gets the file structure from psffsd
  69.     //
  70.     if (psffsd->f == 0) {
  71.        ext2_os2_panic(1, "FS_CLOSE - file is NULL");
  72.     }
  73.  
  74.     //
  75.     // Do the time stamping stuff - We propagate the time stamp to disk if the
  76.     // ST_Pxxx flag is set.
  77.     //
  78.     if (psffsi->sfi_tstamp & ST_PCREAT) {
  79.         psffsd->f->f_inode->i_ctime = date_dos2unix(psffsi->sfi_ctime, psffsi->sfi_cdate);
  80.         psffsd->f->f_inode->i_dirt  = 1;
  81.     }
  82.  
  83.     if (psffsi->sfi_tstamp & ST_PREAD) {
  84.         psffsd->f->f_inode->i_atime = date_dos2unix(psffsi->sfi_atime, psffsi->sfi_adate);
  85.         psffsd->f->f_inode->i_dirt  = 1;
  86.     }
  87.  
  88.     if (psffsi->sfi_tstamp & ST_PWRITE) {
  89.         psffsd->f->f_inode->i_mtime = date_dos2unix(psffsi->sfi_mtime, psffsi->sfi_mdate);
  90.         psffsd->f->f_inode->i_dirt  = 1;
  91.     }
  92.  
  93.  
  94.     //
  95.     // The doc isn't clear about the role of the 'type' parameter. It seems we must
  96.     // only free the resources (file structure in sffsd) at FS_CL_FORSYS time. Otherwise
  97.     // we'' receive an empty sffsd somewhere else !
  98.     // For other 'type' values, maybe we could do a flush ...
  99.     //
  100.     if (parms->type != FS_CL_FORSYS) {
  101. #ifdef FS_TRACE
  102.         kernel_printf("***** Non final system close **** - sffsi->sfi_type = %d - Type = %d", psffsi->sfi_type, type);
  103. #endif
  104.         return NO_ERROR;
  105.     } /* endif */
  106.  
  107.     //
  108.     // Final close for the system
  109.     //
  110.     if ((parms->type == FS_CL_FORSYS) && (Read_Write) && (psffsd->f->f_inode->i_ino != INODE_DASD)) {
  111.         if (psffsd->f->f_op) {
  112.             if (psffsd->f->f_op->release) {          
  113.                 psffsd->f->f_op->release(psffsd->f->f_inode, psffsd->f);            
  114.             } else {
  115.                 ext2_os2_panic(1, "FS_CLOSE - psffsd->f->f_op->release == NULL : shouldn't occur in this release");
  116.             }
  117.         } else {
  118.             ext2_os2_panic(1, "FS_CLOSE - psffsd->f->f_op == NULL : shouldn't occur in this release");
  119.         }
  120.     }
  121.  
  122.     //
  123.     // Closes the file
  124.     //
  125.     if ((rc = vfs_close(psffsd->f)) != NO_ERROR) {
  126.         fs_err(FUNC_FS_CLOSE, FUNC_CLOSE, rc, FILE_TEST_C, __LINE__);
  127.         return rc;
  128.     }
  129.  
  130.     //
  131.     // Clean up of sffsd (safety purposes ...)
  132.     //
  133.     memset(psffsd, 0, sizeof(union sffsd32));
  134.  
  135.     rc = NO_ERROR;
  136.         }
  137.     }
  138.     return rc;
  139. }
  140.